MODUL AJAR

MYSQL DATABASE

Panduan Lengkap Basis Data MySQL
dari Dasar hingga Mahir
Disusun oleh: Tim Pengembangan Kurikulum
Program Studi Teknik Informatika
@2026

i KATA PENGANTAR

Puji syukur ke hadirat Tuhan Yang Maha Esa, karena atas berkat dan rahmat-Nya, modul ajar "MySQL Database Lengkap dengan Praktikum" dapat diselesaikan dengan baik. Modul ini dirancang sebagai panduan komprehensif untuk mempelajari sistem manajemen basis data MySQL, mulai dari konsep dasar hingga implementasi praktis.

MySQL merupakan salah satu sistem manajemen basis data relasional (RDBMS) yang paling populer di dunia. Dengan sifatnya yang open source, performa tinggi, dan kemudahan penggunaan, MySQL menjadi pilihan utama dalam pengembangan aplikasi web, baik skala kecil maupun enterprise.

Modul ini disusun secara sistematis dengan pendekatan pembelajaran berbasis praktikum. Setiap materi dilengkapi dengan:

  • Tujuan pembelajaran yang jelas
  • Penjelasan teori yang mudah dipahami
  • Contoh query dengan berbagai variasi
  • Praktikum langkah demi langkah
  • Latihan dan studi kasus

Kami berharap modul ini dapat membantu mahasiswa, pengajar, dan praktisi dalam menguasai MySQL database. Kritik dan saran yang membangun sangat kami harapkan untuk penyempurnaan modul ini di masa mendatang.

Jakarta, Januari 2026

Tim Penyusun

DAFTAR ISI

1 MySQL Database 1
2 MySQL Connect 4
3 MySQL Create DB 7
4 MySQL Create Table 10
5 MySQL Insert Data 13
6 MySQL Get Last ID 16
7 MySQL Insert Multiple 18
8 MySQL Prepared 21
9 MySQL Select Data 24
10 MySQL Where 27
11 MySQL Order By 30
12 MySQL Delete Data 33
13 MySQL Update Data 36
14 MySQL Limit Data 39
A Studi Kasus: Aplikasi Perpustakaan 42
B Glosarium 48
C Daftar Pustaka 50
D Index 51

1 MYSQL DATABASE

Kompetensi Dasar

  • Memahami konsep database dan RDBMS
  • Mengenal sejarah dan perkembangan MySQL
  • Memahami kelebihan MySQL dibanding database lain
  • Mengenal tipe data dalam MySQL

A. Pengenalan Database

1. Apa itu Database?

Database (basis data) adalah kumpulan data yang terorganisir secara sistematis dan tersimpan dalam komputer. Data dalam database dapat diakses, dikelola, dan diperbarui dengan mudah menggunakan sistem manajemen database (DBMS).

2. Sistem Manajemen Database Relasional (RDBMS)

RDBMS adalah program yang memungkinkan pengguna untuk membuat, memperbarui, dan mengelola database relasional. Data disimpan dalam bentuk tabel yang saling berhubungan.

Fitur Deskripsi
Tabel Data disimpan dalam baris dan kolom
Primary Key Identifier unik untuk setiap baris
Foreign Key Menghubungkan antar tabel
SQL Bahasa untuk mengelola database

B. MySQL

Sejarah MySQL

  • 1995: MySQL dikembangkan oleh MySQL AB (Swedia)
  • 2008: Sun Microsystems mengakuisisi MySQL AB
  • 2010: Oracle Corporation mengakuisisi Sun Microsystems
  • Sekarang: MySQL menjadi salah satu RDBMS paling populer

Kelebihan MySQL

Aspek Kelebihan
Open Source Gratis dan dapat dimodifikasi
Performa Cepat dan stabil untuk berbagai ukuran data
Keamanan Sistem hak akses yang canggih
Cross-platform Berjalan di Windows, Linux, Mac
Skalabilitas Dapat menangani data besar

C. Tipe Data MySQL

1. Tipe Data Numerik

Tipe Ukuran Jangkauan Penggunaan
TINYINT 1 byte -128 s/d 127 Angka kecil, status
SMALLINT 2 byte -32,768 s/d 32,767 Angka sedang
MEDIUMINT 3 byte -8M s/d 8M Angka menengah
INT 4 byte -2B s/d 2B Angka standar
BIGINT 8 byte Sangat besar Angka besar
FLOAT 4 byte Desimal Angka desimal presisi tunggal
DOUBLE 8 byte Desimal Angka desimal presisi ganda
DECIMAL Variabel Desimal Angka desimal presisi tepat

2. Tipe Data String

Tipe Ukuran Deskripsi
CHAR(n) n byte String tetap panjang
VARCHAR(n) n+1 byte String variabel panjang
TEXT 65,535 byte Teks panjang
MEDIUMTEXT 16MB Teks lebih panjang
LONGTEXT 4GB Teks sangat panjang
ENUM 1-2 byte Pilihan nilai tertentu
SET 1-8 byte Kombinasi nilai

3. Tipe Data Tanggal dan Waktu

Tipe Ukuran Format Jangkauan
DATE 3 byte YYYY-MM-DD 1000-01-01 s/d 9999-12-31
TIME 3 byte HH:MM:SS -838:59:59 s/d 838:59:59
DATETIME 8 byte YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00 s/d 9999-12-31 23:59:59
TIMESTAMP 4 byte YYYY-MM-DD HH:MM:SS 1970-01-01 s/d 2038-01-19
YEAR 1 byte YYYY 1901 s/d 2155

โšก Praktikum 1: Mengenal MySQL melalui phpMyAdmin

1 Akses phpMyAdmin

Buka browser dan ketik: http://localhost/phpmyadmin

2 Eksplorasi Interface

Kenali bagian-bagian phpMyAdmin:

  • Sidebar kiri: Daftar database
  • Panel utama: Informasi server
  • Tab navigasi: Database, SQL, Status, dll
  • Bagian bawah: Informasi server MySQL
3 Cek Informasi Server
SHOW VARIABLES LIKE 'version';
SHOW STATUS;
SELECT VERSION();
4 Lihat Database yang Ada
SHOW DATABASES;
๐Ÿ“Œ Catatan Penting:
  • MySQL bersifat case-insensitive untuk keyword SQL, tetapi case-sensitive untuk nama database dan tabel di Linux
  • Setiap pernyataan SQL diakhiri dengan titik koma (;)
  • Gunakan huruf kecil untuk nama database, tabel, dan kolom untuk konsistensi
1

2 MYSQL CONNECT

Kompetensi Dasar

  • Memahami cara koneksi ke MySQL server
  • Menguasai berbagai metode koneksi
  • Mampu mengatasi error koneksi

A. Metode Koneksi MySQL

1. Koneksi melalui Command Line

mysql -u username -p
mysql -u root -p
Enter password: ******

2. Koneksi melalui PHP (MySQLi)

<?php
// Koneksi MySQLi (Object-oriented)
$mysqli = new mysqli("localhost", "root", "", "nama_database");

if ($mysqli->connect_error) {
    die("Koneksi gagal: " . $mysqli->connect_error);
}
echo "Koneksi berhasil";
?>

3. Koneksi melalui PHP (PDO)

<?php
try {
    $pdo = new PDO("mysql:host=localhost;dbname=nama_database", "root", "");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Koneksi berhasil";
} catch(PDOException $e) {
    echo "Koneksi gagal: " . $e->getMessage();
}
?>

โšก Praktikum 2: Berbagai Cara Koneksi MySQL

Praktikum 2.1: Koneksi melalui Command Line

1 Buka Terminal/Command Prompt
2 Koneksi sebagai root
mysql -u root -p
3 Masukkan password (kosongkan jika default)
4 Cek koneksi
mysql> SELECT USER();
mysql> STATUS;

Praktikum 2.2: Koneksi dengan PHP MySQLi

Buat file koneksi_mysqli.php:

<!DOCTYPE html>
<html>
<head>
    <title>Koneksi MySQLi</title>
    <style>
        .success { color: green; padding: 10px; border: 1px solid green; }
        .error { color: red; padding: 10px; border: 1px solid red; }
    </style>
</head>
<body>
    <h2>>Demo Koneksi MySQL dengan MySQLi</h2>
    
    <?php
    // Konfigurasi database
    $host = "localhost";
    $username = "root";
    $password = "";
    $database = "test";
    
    // Membuat koneksi
    $conn = new mysqli($host, $username, $password, $database);
    
    // Cek koneksi
    if ($conn->connect_error) {
        echo "<div class='error'>โŒ Koneksi gagal: " . $conn->connect_error . "</div>";
    } else {
        echo "<div class='success'>โœ… Koneksi berhasil!</div>";
        
        // Tampilkan informasi server
        echo "<h3>Informasi Server:</h3>";
        echo "<ul>";
        echo "<li>Server version: " . $conn->server_info . "</li>";
        echo "<li>Host info: " . $conn->host_info . "</li>";
        echo "<li>Protocol version: " . $conn->protocol_version . "</li>";
        echo "<li>Character set: " . $conn->character_set_name() . "</li>";
        echo "</ul>";
    }
    
    // Tutup koneksi
    $conn->close();
    ?>
</body>
</html>

Praktikum 2.3: Koneksi dengan PDO

Buat file koneksi_pdo.php:

<?php
// Konfigurasi database
$host = 'localhost';
$dbname = 'test';
$username = 'root';
$password = '';

try {
    // Membuat koneksi PDO
    $dsn = "mysql:host=$host;dbname=$dbname;charset=utf8mb4";
    $options = [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES => false,
    ];
    
    $pdo = new PDO($dsn, $username, $password, $options);
    
    echo "<div style='color: green; padding: 10px; border: 1px solid green;'>";
    echo "โœ… Koneksi PDO berhasil!<br>";
    
    // Tampilkan informasi PDO
    echo "Driver: " . $pdo->getAttribute(PDO::ATTR_DRIVER_NAME) . "<br>";
    echo "Server version: " . $pdo->getAttribute(PDO::ATTR_SERVER_VERSION) . "<br>";
    echo "Client version: " . $pdo->getAttribute(PDO::ATTR_CLIENT_VERSION) . "<br>";
    echo "</div>";
    
} catch (PDOException $e) {
    // Tangani error koneksi
    echo "<div style='color: red; padding: 10px; border: 1px solid red;'>";
    echo "โŒ Koneksi gagal: " . $e->getMessage() . "<br>";
    echo "Error code: " . $e->getCode() . "<br>";
    echo "</div>";
}
?>

Praktikum 2.4: Class Koneksi Database

Buat file Database.php:

<?php
/**
 * Class Database untuk mengelola koneksi MySQL
 * Menggunakan pattern Singleton
 */
class Database {
    private static $instance = null;
    private $conn;
    private $host = 'localhost';
    private $username = 'root';
    private $password = '';
    private $database = 'test';
    
    private function __construct() {
        try {
            $this->conn = new mysqli(
                $this->host, 
                $this->username, 
                $this->password, 
                $this->database
            );
            
            if ($this->conn->connect_error) {
                throw new Exception("Connection failed: " . $this->conn->connect_error);
            }
            
            // Set charset
            $this->conn->set_charset("utf8mb4");
            
        } catch (Exception $e) {
            die("Error: " . $e->getMessage());
        }
    }
    
    public static function getInstance() {
        if (self::$instance == null) {
            self::$instance = new Database();
        }
        return self::$instance;
    }
    
    public function getConnection() {
        return $this->conn;
    }
    
    public function query($sql) {
        return $this->conn->query($sql);
    }
    
    public function escape($string) {
        return $this->conn->real_escape_string($string);
    }
    
    public function close() {
        if ($this->conn) {
            $this->conn->close();
        }
    }
}

// Penggunaan
$db = Database::getInstance();
$conn = $db->getConnection();
echo "Koneksi database siap digunakan";
?>
๐Ÿ’ก Pro Tip:
  • Selalu gunakan try-catch untuk menangani error koneksi
  • Simpan konfigurasi database di file terpisah (config.php)
  • Gunakan environment variable untuk menyimpan credential di production
  • Set charset ke utf8mb4 untuk mendukung emoji dan karakter khusus
โš ๏ธ Error Umum dan Solusinya:
Error Penyebab Solusi
Connection refused MySQL server tidak berjalan Start MySQL di XAMPP/WAMP
Access denied for user Username/password salah Cek credential database
Unknown database Database tidak ditemukan Buat database terlebih dahulu
Port not open Port MySQL bukan 3306 Sesuaikan port di konfigurasi

Latihan 1: Koneksi Database

Soal 1: Buat koneksi MySQL menggunakan MySQLi dengan pengaturan berikut:

  • Host: localhost
  • Username: root
  • Password: (kosong)
  • Database: db_latihan

Soal 2: Buat fungsi untuk mengecek status koneksi dan menampilkan:

  • Waktu koneksi
  • IP server
  • Versi MySQL
  • Database yang sedang digunakan

Soal 3: Buat class Database dengan method:

  • connect() - untuk koneksi
  • disconnect() - untuk menutup koneksi
  • isConnected() - cek status koneksi
  • getInfo() - informasi database
4

3 MYSQL CREATE DATABASE

Kompetensi Dasar

  • Memahami cara membuat database
  • Menguasai sintaks CREATE DATABASE
  • Mampu mengelola database

A. Membuat Database

Sintaks Dasar

CREATE DATABASE nama_database;
CREATE DATABASE IF NOT EXISTS nama_database;

Dengan Opsi

CREATE DATABASE nama_database
    CHARACTER SET utf8mb4
    COLLATE utf8mb4_unicode_ci;

Menampilkan Database

SHOW DATABASES;
SHOW DATABASES LIKE '%user%';

Menggunakan Database

USE nama_database;

Menghapus Database

DROP DATABASE nama_database;
DROP DATABASE IF EXISTS nama_database;

โšก Praktikum 3: Membuat dan Mengelola Database

Praktikum 3.1: Membuat Database melalui Command Line

mysql> CREATE DATABASE universitas;
Query OK, 1 row affected (0.01 sec)

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| universitas        |
+--------------------+
4 rows in set (0.00 sec)

mysql> USE universitas;
Database changed

mysql> SELECT DATABASE();
+-------------+
| DATABASE()  |
+-------------+
| universitas |
+-------------+
1 row in set (0.00 sec)

Praktikum 3.2: Membuat Database dengan PHP

Buat file create_database.php:

<?php
// Koneksi ke MySQL server (tanpa memilih database)
$conn = new mysqli("localhost", "root", "");

// Cek koneksi
if ($conn->connect_error) {
    die("Koneksi gagal: " . $conn->connect_error);
}

echo "<h2>Membuat Database dengan PHP</h2>";

// Array database yang akan dibuat
$databases = [
    "universitas" => "Database Universitas",
    "perpustakaan" => "Database Perpustakaan",
    "rumah_sakit" => "Database Rumah Sakit"
];

foreach ($databases as $dbName => $description) {
    // Query untuk membuat database
    $sql = "CREATE DATABASE IF NOT EXISTS $dbName 
            CHARACTER SET utf8mb4 
            COLLATE utf8mb4_unicode_ci";
    
    if ($conn->query($sql) === TRUE) {
        echo "โœ… Database '$dbName' ($description) berhasil dibuat<br>";
    } else {
        echo "โŒ Error membuat database '$dbName': " . $conn->error . "<br>";
    }
}

// Tampilkan semua database
echo "<h3>Daftar Database:</h3>";
$result = $conn->query("SHOW DATABASES");

echo "<ul>";
while ($row = $result->fetch_array()) {
    echo "<li>" . $row[0] . "</li>";
}
echo "</ul>";

$conn->close();
?>

Praktikum 3.3: Form Pembuatan Database

Buat file form_create_db.php:

<!DOCTYPE html>
<html>
<head>
    <title>Form Pembuatan Database</title>
    <style>
        body { font-family: Arial; margin: 40px; }
        .container { max-width: 600px; margin: 0 auto; }
        .form-group { margin-bottom: 15px; }
        label { display: block; margin-bottom: 5px; font-weight: bold; }
        input[type="text"], select { 
            width: 100%; 
            padding: 10px; 
            border: 2px solid #ddd;
            border-radius: 5px;
        }
        input[type="submit"] {
            background: #3498db;
            color: white;
            padding: 12px 25px;
            border: none;
            border-radius: 5px;
            cursor: pointer;
            font-size: 16px;
        }
        .result {
            margin-top: 20px;
            padding: 15px;
            border-radius: 5px;
        }
        .success { background: #d4edda; border: 1px solid #c3e6cb; }
        .error { background: #f8d7da; border: 1px solid #f5c6cb; }
    </style>
</head>
<body>
    <div class="container">
        <h2>Form Pembuatan Database Baru</h2>
        
        <form method="POST" action="">
            <div class="form-group">
                <label>Nama Database:</label>
                <input type="text" name="db_name" required 
                       pattern="[a-zA-Z_][a-zA-Z0-9_]*"
                       title="Huruf, angka, underscore, tidak boleh diawali angka">
                <small>Gunakan huruf kecil, tanpa spasi</small>
            </div>
            
            <div class="form-group">
                <label>Character Set:</label>
                <select name="charset">
                    <option value="utf8mb4">utf8mb4 (Unicode, support emoji)</option>
                    <option value="utf8">utf8</option>
                    <option value="latin1">latin1</option>
                </select>
            </div>
            
            <div class="form-group">
                <label>Collation:</label>
                <select name="collation">
                    <option value="utf8mb4_unicode_ci">utf8mb4_unicode_ci</option>
                    <option value="utf8mb4_general_ci">utf8mb4_general_ci</option>
                    <option value="latin1_swedish_ci">latin1_swedish_ci</option>
                </select>
            </div>
            
            <input type="submit" name="submit" value="Buat Database">
        </form>
        
        <?php
        if (isset($_POST['submit'])) {
            $db_name = $_POST['db_name'];
            $charset = $_POST['charset'];
            $collation = $_POST['collation'];
            
            // Koneksi ke MySQL
            $conn = new mysqli("localhost", "root", "");
            
            if ($conn->connect_error) {
                echo "<div class='result error'>โŒ Koneksi gagal: " . $conn->connect_error . "</div>";
            } else {
                // Query create database
                $sql = "CREATE DATABASE IF NOT EXISTS `$db_name` 
                        CHARACTER SET $charset 
                        COLLATE $collation";
                
                if ($conn->query($sql) === TRUE) {
                    echo "<div class='result success'>";
                    echo "โœ… Database '$db_name' berhasil dibuat!<br>";
                    echo "Character Set: $charset<br>";
                    echo "Collation: $collation</div>";
                } else {
                    echo "<div class='result error'>โŒ Error: " . $conn->error . "</div>";
                }
                
                $conn->close();
            }
        }
        ?>
        
        <h3>Database yang Sudah Ada:</h3>
        <?php
        $conn = new mysqli("localhost", "root", "");
        $result = $conn->query("SHOW DATABASES");
        echo "<ul>";
        while ($row = $result->fetch_array()) {
            echo "<li>" . $row[0] . "</li>";
        }
        echo "</ul>";
        $conn->close();
        ?>
    </div>
</body>
</html>
๐Ÿ“Œ Aturan Penamaan Database:
  • Maksimal 64 karakter
  • Huruf, angka, underscore (_)
  • Tidak boleh diawali angka
  • Case-sensitive di Linux, tidak di Windows
  • Hindari menggunakan kata kunci SQL
7

4 MYSQL CREATE TABLE

Kompetensi Dasar

  • Memahami struktur tabel dalam database
  • Menguasai sintaks CREATE TABLE
  • Memahami tipe data dan constraint
  • Mampu merancang tabel yang efisien

A. Membuat Tabel

Sintaks Dasar

CREATE TABLE nama_tabel (
    nama_kolom1 tipe_data [constraint],
    nama_kolom2 tipe_data [constraint],
    ...
    [table_constraints]
);

Constraint dalam MySQL

Constraint Deskripsi
NOT NULL Kolom tidak boleh kosong
UNIQUE Nilai kolom harus unik
PRIMARY KEY Identitas unik setiap baris
FOREIGN KEY Menghubungkan ke tabel lain
DEFAULT Nilai default jika tidak diisi
AUTO_INCREMENT Penomoran otomatis
CHECK Validasi nilai

โšก Praktikum 4: Membuat Tabel untuk Sistem Akademik

Praktikum 4.1: Membuat Tabel Mahasiswa

USE universitas;

CREATE TABLE mahasiswa (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nim VARCHAR(20) NOT NULL UNIQUE,
    nama VARCHAR(100) NOT NULL,
    tempat_lahir VARCHAR(50),
    tanggal_lahir DATE,
    jenis_kelamin ENUM('L', 'P'),
    alamat TEXT,
    email VARCHAR(100) UNIQUE,
    no_telepon VARCHAR(15),
    angkatan YEAR,
    status ENUM('aktif', 'cuti', 'lulus', 'keluar') DEFAULT 'aktif',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

Praktikum 4.2: Membuat Tabel Dosen

CREATE TABLE dosen (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nidn VARCHAR(20) NOT NULL UNIQUE,
    nama VARCHAR(100) NOT NULL,
    gelar_depan VARCHAR(20),
    gelar_belakang VARCHAR(50),
    pendidikan_terakhir VARCHAR(50),
    jabatan_fungsional VARCHAR(50),
    email VARCHAR(100) UNIQUE,
    no_telepon VARCHAR(15),
    alamat TEXT,
    status ENUM('aktif', 'tidak_aktif') DEFAULT 'aktif',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Praktikum 4.3: Membuat Tabel Mata Kuliah

CREATE TABLE mata_kuliah (
    id INT AUTO_INCREMENT PRIMARY KEY,
    kode_mk VARCHAR(20) NOT NULL UNIQUE,
    nama_mk VARCHAR(100) NOT NULL,
    sks TINYINT NOT NULL CHECK (sks IN (1,2,3,4,6)),
    semester TINYINT,
    deskripsi TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Praktikum 4.4: Membuat Tabel dengan Relasi

CREATE TABLE perkuliahan (
    id INT AUTO_INCREMENT PRIMARY KEY,
    id_mahasiswa INT NOT NULL,
    id_mata_kuliah INT NOT NULL,
    id_dosen INT NOT NULL,
    semester VARCHAR(10),
    tahun_akademik VARCHAR(9),
    nilai_uts DECIMAL(5,2),
    nilai_uas DECIMAL(5,2),
    nilai_akhir DECIMAL(5,2),
    nilai_huruf CHAR(2),
    FOREIGN KEY (id_mahasiswa) REFERENCES mahasiswa(id) ON DELETE CASCADE,
    FOREIGN KEY (id_mata_kuliah) REFERENCES mata_kuliah(id) ON DELETE CASCADE,
    FOREIGN KEY (id_dosen) REFERENCES dosen(id) ON DELETE CASCADE,
    UNIQUE KEY unique_perkuliahan (id_mahasiswa, id_mata_kuliah, semester, tahun_akademik)
);

Praktikum 4.5: Menampilkan Struktur Tabel

-- Menampilkan struktur tabel
DESCRIBE mahasiswa;
DESC mahasiswa;

-- Menampilkan perintah CREATE TABLE
SHOW CREATE TABLE mahasiswa;

-- Menampilkan semua tabel
SHOW TABLES;

-- Menampilkan informasi tabel
SHOW TABLE STATUS LIKE 'mahasiswa';

Entity Relationship Diagram (ERD)

mahasiswa

๐Ÿ”‘ id (PK)
nim
nama
tanggal_lahir
alamat
โ†’

perkuliahan

๐Ÿ”‘ id (PK)
๐Ÿ”— id_mahasiswa (FK)
๐Ÿ”— id_mata_kuliah (FK)
๐Ÿ”— id_dosen (FK)
nilai
โ†’

mata_kuliah

๐Ÿ”‘ id (PK)
kode_mk
nama_mk
sks
๐Ÿ’ก Best Practice Membuat Tabel:
  • Gunakan nama tabel dalam bentuk jamak (mahasiswa, dosen)
  • Gunakan huruf kecil dan underscore untuk nama tabel dan kolom
  • Setiap tabel harus memiliki PRIMARY KEY (biasanya id)
  • Gunakan tipe data yang tepat untuk setiap kolom
  • Tambahkan kolom created_at dan updated_at untuk audit trail
  • Gunakan CONSTRAINT untuk menjaga integritas data
10

5 MYSQL INSERT DATA

Kompetensi Dasar

  • Memahami cara menambahkan data ke tabel
  • Menguasai berbagai sintaks INSERT
  • Mampu menangani error saat insert

A. Sintaks INSERT

1. INSERT dengan semua kolom

INSERT INTO mahasiswa 
VALUES (NULL, '2026001', 'Budi Santoso', 'Jakarta', '2000-01-15', 
        'L', 'Jl. Merdeka No.1', 'budi@email.com', '08123456789', 2026, 'aktif');

2. INSERT dengan kolom spesifik

INSERT INTO mahasiswa (nim, nama, email, angkatan) 
VALUES ('2026002', 'Ani Wijaya', 'ani@email.com', 2026);

3. INSERT multiple data

INSERT INTO mahasiswa (nim, nama, email, angkatan) VALUES
    ('2026003', 'Citra Dewi', 'citra@email.com', 2026),
    ('2026004', 'Dodi Kurniawan', 'dodi@email.com', 2026),
    ('2026005', 'Eka Putri', 'eka@email.com', 2026);

โšก Praktikum 5: Insert Data ke Tabel

Praktikum 5.1: Insert Data Mahasiswa

-- Insert data mahasiswa
INSERT INTO mahasiswa (nim, nama, tempat_lahir, tanggal_lahir, jenis_kelamin, alamat, email, no_telepon, angkatan) VALUES
    ('202601001', 'Ahmad Fauzi', 'Jakarta', '2002-05-10', 'L', 'Jl. Merdeka No. 10', 'ahmad.fauzi@email.com', '081234567001', 2026),
    ('202601002', 'Budi Santoso', 'Bandung', '2002-08-15', 'L', 'Jl. Asia Afrika No. 25', 'budi.santoso@email.com', '081234567002', 2026),
    ('202601003', 'Citra Dewi', 'Surabaya', '2002-03-20', 'P', 'Jl. Tunjungan No. 15', 'citra.dewi@email.com', '081234567003', 2026),
    ('202601004', 'Dian Purnama', 'Medan', '2002-11-05', 'P', 'Jl. Sudirman No. 8', 'dian.purnama@email.com', '081234567004', 2026),
    ('202601005', 'Eko Prasetyo', 'Semarang', '2002-07-12', 'L', 'Jl. Pandanaran No. 30', 'eko.prasetyo@email.com', '081234567005', 2026);

Praktikum 5.2: Insert Data Dosen

INSERT INTO dosen (nidn, nama, gelar_depan, gelar_belakang, pendidikan_terakhir, jabatan_fungsional, email, no_telepon, alamat) VALUES
    ('12345678901', 'Prof. Dr. Hendra Wijaya', 'Prof.', 'Ph.D.', 'S3', 'Guru Besar', 'hendra@univ.ac.id', '081234567101', 'Jl. Pendidikan No. 1'),
    ('12345678902', 'Dr. Siti Aminah', 'Dr.', 'M.Kom.', 'S3', 'Lektor Kepala', 'siti@univ.ac.id', '081234567102', 'Jl. Ilmu No. 5'),
    ('12345678903', 'Bambang Susilo', '', 'M.T.', 'S2', 'Lektor', 'bambang@univ.ac.id', '081234567103', 'Jl. Raya No. 12');

Praktikum 5.3: Insert Data Mata Kuliah

INSERT INTO mata_kuliah (kode_mk, nama_mk, sks, semester, deskripsi) VALUES
    ('IF101', 'Algoritma Pemrograman', 3, 1, 'Dasar-dasar algoritma dan pemrograman menggunakan Python'),
    ('IF102', 'Struktur Data', 3, 2, 'Konsep dan implementasi struktur data'),
    ('IF103', 'Basis Data', 3, 3, 'Sistem manajemen basis data dan SQL'),
    ('IF201', 'Pemrograman Web', 4, 4, 'Pengembangan aplikasi web dengan PHP dan MySQL'),
    ('IF202', 'Jaringan Komputer', 3, 4, 'Konsep dan implementasi jaringan komputer');

Praktikum 5.4: Insert Data Perkuliahan

INSERT INTO perkuliahan (id_mahasiswa, id_mata_kuliah, id_dosen, semester, tahun_akademik, nilai_uts, nilai_uas, nilai_akhir, nilai_huruf) VALUES
    (1, 1, 1, 'Ganjil', '2026/2025', 85, 90, 87.5, 'A'),
    (1, 2, 2, 'Ganjil', '2026/2025', 78, 82, 80, 'B+'),
    (2, 1, 1, 'Ganjil', '2026/2025', 90, 88, 89, 'A'),
    (2, 3, 3, 'Ganjil', '2026/2025', 75, 80, 77.5, 'B'),
    (3, 2, 2, 'Ganjil', '2026/2025', 82, 85, 83.5, 'B+');
โš ๏ธ Error Umum Saat Insert:
  • Duplicate entry: Melanggar UNIQUE constraint
  • Cannot be null: Kolom NOT NULL tidak diisi
  • Data too long: Data melebihi panjang kolom
  • Incorrect integer value: Tipe data tidak sesuai
  • Foreign key constraint fails: Referensi ke data yang tidak ada
13

6 MYSQL GET LAST ID

A. Mendapatkan ID Terakhir

1. Di MySQL Command Line

SELECT LAST_INSERT_ID();

2. Di PHP dengan MySQLi

<?php
$sql = "INSERT INTO mahasiswa (nim, nama) VALUES ('2026006', 'Fajar')";
if ($conn->query($sql) === TRUE) {
    $last_id = $conn->insert_id;
    echo "Data berhasil ditambahkan. ID terakhir: " . $last_id;
}
?>

3. Di PHP dengan PDO

<?php
$sql = "INSERT INTO mahasiswa (nim, nama) VALUES ('2026007', 'Gita')";
$pdo->exec($sql);
$last_id = $pdo->lastInsertId();
echo "ID terakhir: " . $last_id;
?>

โšก Praktikum 6: Aplikasi dengan Last Insert ID

Praktikum 6.1: Form Pendaftaran dengan Relasi

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $conn = new mysqli("localhost", "root", "", "universitas");
    
    // Insert data mahasiswa
    $nim = $conn->real_escape_string($_POST['nim']);
    $nama = $conn->real_escape_string($_POST['nama']);
    $email = $conn->real_escape_string($_POST['email']);
    
    $sql_mahasiswa = "INSERT INTO mahasiswa (nim, nama, email, angkatan) 
                      VALUES ('$nim', '$nama', '$email', 2026)";
    
    if ($conn->query($sql_mahasiswa) === TRUE) {
        $id_mahasiswa = $conn->insert_id;
        
        // Insert data perkuliahan menggunakan ID yang baru
        $id_mk = $_POST['id_mata_kuliah'];
        $id_dosen = $_POST['id_dosen'];
        
        $sql_perkuliahan = "INSERT INTO perkuliahan (id_mahasiswa, id_mata_kuliah, id_dosen, semester, tahun_akademik) 
                           VALUES ($id_mahasiswa, $id_mk, $id_dosen, 'Ganjil', '2026/2025')";
        
        if ($conn->query($sql_perkuliahan) === TRUE) {
            echo "<div style='color: green;'>";
            echo "โœ… Pendaftaran berhasil!<br>";
            echo "ID Mahasiswa: $id_mahasiswa<br>";
            echo "ID Perkuliahan: " . $conn->insert_id;
            echo "</div>";
        }
    }
    
    $conn->close();
}
?>
16

7 MYSQL INSERT MULTIPLE

A. Insert Multiple Data

1. Multiple VALUES

INSERT INTO mahasiswa (nim, nama, angkatan) VALUES
    ('2026008', 'Hadi', 2026),
    ('2026009', 'Indah', 2026),
    ('2026010', 'Joko', 2026);

2. INSERT SELECT

INSERT INTO mahasiswa_baru (nim, nama, angkatan)
SELECT nim, nama, angkatan FROM mahasiswa WHERE angkatan = 2026;

โšก Praktikum 7: Insert Multiple dengan PHP

Praktikum 7.1: Import Data dari Array

<?php
$conn = new mysqli("localhost", "root", "", "universitas");

// Data mahasiswa dalam array
$data_mahasiswa = [
    ['2026011', 'Kartika', 'kartika@email.com'],
    ['2026012', 'Lukman', 'lukman@email.com'],
    ['2026013', 'Maya', 'maya@email.com'],
    ['2026014', 'Nanda', 'nanda@email.com'],
    ['2026015', 'Oscar', 'oscar@email.com']
];

// Siapkan query
$sql = "INSERT INTO mahasiswa (nim, nama, email, angkatan) VALUES (?, ?, ?, 2026)";
$stmt = $conn->prepare($sql);
$stmt->bind_param("sss", $nim, $nama, $email);

// Execute multiple times
$success = 0;
$failed = 0;

foreach ($data_mahasiswa as $mhs) {
    $nim = $mhs[0];
    $nama = $mhs[1];
    $email = $mhs[2];
    
    if ($stmt->execute()) {
        $success++;
    } else {
        $failed++;
    }
}

echo "<h3>Hasil Import Data:</h3>";
echo "โœ… Berhasil: $success data<br>";
echo "โŒ Gagal: $failed data<br>";

$stmt->close();
$conn->close();
?>
18

8 MYSQL PREPARED STATEMENT

A. Prepared Statement

Prepared statement adalah fitur keamanan untuk mencegah SQL Injection dengan memisahkan query dan data.

Keuntungan Prepared Statement:

  • Mencegah SQL Injection
  • Performa lebih baik untuk query berulang
  • Otomatis menangani escaping karakter

โšก Praktikum 8: Implementasi Prepared Statement

Praktikum 8.1: Insert dengan Prepared Statement

<?php
$conn = new mysqli("localhost", "root", "", "universitas");

// Siapkan prepared statement
$stmt = $conn->prepare("INSERT INTO mahasiswa (nim, nama, email, angkatan) VALUES (?, ?, ?, ?)");

// Bind parameter (i=int, s=string, d=double, b=blob)
$stmt->bind_param("sssi", $nim, $nama, $email, $angkatan);

// Set parameter dan execute
$nim = "2026016";
$nama = "Putu";
$email = "putu@email.com";
$angkatan = 2026;
$stmt->execute();

echo "Data berhasil ditambahkan";

$stmt->close();
$conn->close();
?>

Praktikum 8.2: Select dengan Prepared Statement

<?php
$conn = new mysqli("localhost", "root", "", "universitas");

// Query dengan parameter
$angkatan = 2026;
$stmt = $conn->prepare("SELECT * FROM mahasiswa WHERE angkatan = ?");
$stmt->bind_param("i", $angkatan);
$stmt->execute();

// Ambil hasil
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    echo $row['nama'] . "<br>";
}

$stmt->close();
$conn->close();
?>

Praktikum 8.3: Form Aman dengan Prepared Statement

<!DOCTYPE html>
<html>
<head>
    <title>Form Aman dengan Prepared Statement</title>
</head>
<body>
    <h2>Pendaftaran Mahasiswa Baru</h2>
    
    <form method="POST" action="">
        NIM: <input type="text" name="nim" required><br>
        Nama: <input type="text" name="nama" required><br>
        Email: <input type="email" name="email" required><br>
        Angkatan: <input type="number" name="angkatan" value="2026"><br>
        <input type="submit" value="Daftar">
    </form>
    
    <?php
    if ($_SERVER["REQUEST_METHOD"] == "POST") {
        $conn = new mysqli("localhost", "root", "", "universitas");
        
        // Menggunakan prepared statement untuk keamanan
        $stmt = $conn->prepare("INSERT INTO mahasiswa (nim, nama, email, angkatan) VALUES (?, ?, ?, ?)");
        $stmt->bind_param("sssi", $_POST['nim'], $_POST['nama'], $_POST['email'], $_POST['angkatan']);
        
        if ($stmt->execute()) {
            echo "<p style='color: green'>โœ… Pendaftaran berhasil!</p>";
        } else {
            echo "<p style='color: red'>โŒ Error: " . $stmt->error . "</p>";
        }
        
        $stmt->close();
        $conn->close();
    }
    ?>
</body>
</html>
๐Ÿ’ก Keamanan dengan Prepared Statement:

Prepared statement secara otomatis meng-escape karakter berbahaya, mencegah SQL Injection seperti:

-- Input berbahaya: '; DROP TABLE mahasiswa; --
$nama = "'; DROP TABLE mahasiswa; --";

-- Tanpa prepared statement (BERBAHAYA!)
$sql = "INSERT INTO mahasiswa (nama) VALUES ('$nama')";
-- Akan menjadi: INSERT INTO mahasiswa (nama) VALUES (''; DROP TABLE mahasiswa; --')

-- Dengan prepared statement (AMAN)
$stmt = $conn->prepare("INSERT INTO mahasiswa (nama) VALUES (?)");
$stmt->bind_param("s", $nama);
-- Input akan di-escape: VALUES ('\'; DROP TABLE mahasiswa; --')
21

9 MYSQL SELECT DATA

A. SELECT Statement

Sintaks Dasar

SELECT kolom1, kolom2, ...
FROM nama_tabel
[WHERE kondisi]
[ORDER BY kolom [ASC|DESC]]
[LIMIT jumlah];

Contoh SELECT

-- Pilih semua kolom
SELECT * FROM mahasiswa;

-- Pilih kolom tertentu
SELECT nim, nama, email FROM mahasiswa;

-- SELECT dengan alias
SELECT 
    nim AS "NIM",
    nama AS "Nama Lengkap",
    email AS "Alamat Email"
FROM mahasiswa;

-- SELECT dengan fungsi
SELECT 
    UPPER(nama) AS nama_kapital,
    LOWER(email) AS email_kecil,
    CONCAT(nim, ' - ', nama) AS info
FROM mahasiswa;

โšก Praktikum 9: Menampilkan Data

Praktikum 9.1: Menampilkan Data Mahasiswa

<!DOCTYPE html>
<html>
<head>
    <title>Data Mahasiswa</title>
    <style>
        table { border-collapse: collapse; width: 100%; }
        th { background: #3498db; color: white; padding: 12px; }
        td { padding: 10px; border: 1px solid #ddd; }
        tr:nth-child(even) { background: #f2f2f2; }
        .container { max-width: 1200px; margin: 0 auto; padding: 20px; }
        h2 { color: #2c3e50; }
    </style>
</head>
<body>
    <div class="container">
        <h2>๐Ÿ“‹ Daftar Mahasiswa Aktif</h2>
        
        <?php
        $conn = new mysqli("localhost", "root", "", "universitas");
        
        // Query dengan JOIN untuk mendapatkan data lengkap
        $sql = "SELECT 
                    m.nim,
                    m.nama,
                    m.email,
                    m.angkatan,
                    COUNT(p.id_mata_kuliah) AS total_mk,
                    AVG(p.nilai_akhir) AS ipk
                FROM mahasiswa m
                LEFT JOIN perkuliahan p ON m.id = p.id_mahasiswa
                WHERE m.status = 'aktif'
                GROUP BY m.id
                ORDER BY m.nama";
        
        $result = $conn->query($sql);
        
        if ($result->num_rows > 0) {
            echo "<table>";
            echo "<tr><th>NIM</th><th>Nama</th><th>Email</th><th>Angkatan</th><th>Total MK</th><th>IPK</th></tr>";
            
            while ($row = $result->fetch_assoc()) {
                echo "<tr>";
                echo "<td>" . $row['nim'] . "</td>";
                echo "<td>" . $row['nama'] . "</td>";
                echo "<td>" . $row['email'] . "</td>";
                echo "<td>" . $row['angkatan'] . "</td>";
                echo "<td>" . ($row['total_mk'] ?? 0) . "</td>";
                echo "<td>" . number_format($row['ipk'] ?? 0, 2) . "</td>";
                echo "</tr>";
            }
            echo "</table>";
            
            echo "<p>Total data: " . $result->num_rows . " mahasiswa</p>";
        } else {
            echo "<p>Tidak ada data mahasiswa</p>";
        }
        
        $conn->close();
        ?>
    </div>
</body>
</html>

Praktikum 9.2: Tabel dengan Pencarian

<!DOCTYPE html>
<html>
<head>
    <title>Data Mahasiswa dengan Pencarian</title>
    <style>
        .search-box { margin: 20px 0; padding: 15px; background: #f4f4f4; border-radius: 5px; }
        input[type="text"] { padding: 10px; width: 300px; border: 2px solid #ddd; border-radius: 5px; }
        input[type="submit"] { padding: 10px 20px; background: #3498db; color: white; border: none; border-radius: 5px; cursor: pointer; }
    </style>
</head>
<body>
    <div class="container">
        <h2>๐Ÿ” Pencarian Data Mahasiswa</h2>
        
        <div class="search-box">
            <form method="GET" action="">
                <input type="text" name="search" placeholder="Cari nama atau NIM..." 
                       value="<?php echo isset($_GET['search']) ? htmlspecialchars($_GET['search']) : ''; ?>">
                <input type="submit" value="Cari">
            </form>
        </div>
        
        <?php
        $conn = new mysqli("localhost", "root", "", "universitas");
        
        $search = isset($_GET['search']) ? $_GET['search'] : '';
        
        // Gunakan prepared statement untuk keamanan
        if (!empty($search)) {
            $searchTerm = "%$search%";
            $stmt = $conn->prepare("SELECT * FROM mahasiswa WHERE nama LIKE ? OR nim LIKE ? ORDER BY nama");
            $stmt->bind_param("ss", $searchTerm, $searchTerm);
            $stmt->execute();
            $result = $stmt->get_result();
        } else {
            $result = $conn->query("SELECT * FROM mahasiswa ORDER BY nama");
        }
        
        if ($result->num_rows > 0) {
            echo "<table>";
            echo "<tr><th>NIM</th><th>Nama</th><th>Email</th><th>Angkatan</th><th>Status</th></tr>";
            
            while ($row = $result->fetch_assoc()) {
                echo "<tr>";
                echo "<td>" . $row['nim'] . "</td>";
                echo "<td>" . $row['nama'] . "</td>";
                echo "<td>" . $row['email'] . "</td>";
                echo "<td>" . $row['angkatan'] . "</td>";
                echo "<td>" . $row['status'] . "</td>";
                echo "</tr>";
            }
            echo "</table>";
            echo "<p>Ditemukan " . $result->num_rows . " data</p>";
        } else {
            echo "<p>Tidak ada data ditemukan</p>";
        }
        
        if (isset($stmt)) $stmt->close();
        $conn->close();
        ?>
    </div>
</body>
</html>
24

10 MYSQL WHERE

A. Klausa WHERE

WHERE digunakan untuk memfilter data berdasarkan kondisi tertentu.

Operator dalam WHERE

Operator Deskripsi Contoh
= Sama dengan angkatan = 2026
!= atau <> Tidak sama status != 'lulus'
> Lebih besar sks > 3
< Lebih kecil nilai < 70
>= Lebih besar sama ipk >= 3.5
<= Lebih kecil sama tanggal_lahir <= '2000-01-01'
BETWEEN Antara dua nilai nilai BETWEEN 70 AND 80
LIKE Pencarian pola nama LIKE 'Budi%'
IN Dalam daftar angkatan IN (2023,2026)
IS NULL Nilai NULL email IS NULL
IS NOT NULL Bukan NULL email IS NOT NULL

โšก Praktikum 10: Filter Data dengan WHERE

Praktikum 10.1: Berbagai Contoh WHERE

-- 1. Mahasiswa angkatan 2026
SELECT * FROM mahasiswa WHERE angkatan = 2026;

-- 2. Mahasiswa lahir setelah tahun 2000
SELECT * FROM mahasiswa WHERE tanggal_lahir > '2000-01-01';

-- 3. Mahasiswa dengan nilai antara 80 dan 90
SELECT m.nama, mk.nama_mk, p.nilai_akhir
FROM perkuliahan p
JOIN mahasiswa m ON p.id_mahasiswa = m.id
JOIN mata_kuliah mk ON p.id_mata_kuliah = mk.id
WHERE p.nilai_akhir BETWEEN 80 AND 90;

-- 4. Pencarian dengan LIKE
SELECT * FROM mahasiswa 
WHERE nama LIKE 'Budi%';           -- Dimulai dengan Budi
WHERE nama LIKE '%santoso';        -- Diakhiri dengan santoso
WHERE nama LIKE '%dewi%';           -- Mengandung dewi
WHERE nama LIKE 'B_d_';            -- Pola dengan wildcard

-- 5. Menggunakan IN
SELECT * FROM mahasiswa 
WHERE angkatan IN (2023, 2026, 2025);

-- 6. Kombinasi AND dan OR
SELECT * FROM mahasiswa 
WHERE (angkatan = 2026 OR angkatan = 2023) 
  AND status = 'aktif';

-- 7. Mengecek NULL
SELECT * FROM mahasiswa WHERE email IS NULL;
SELECT * FROM mahasiswa WHERE email IS NOT NULL;

Praktikum 10.2: Filter Dinamis dengan PHP

<!DOCTYPE html>
<html>
<head>
    <title>Filter Data Mahasiswa</title>
</head>
<body>
    <h2>๐Ÿ”Ž Filter Data Mahasiswa</h2>
    
    <form method="GET" action="">
        <select name="angkatan">
            <option value="">Semua Angkatan</option>
            <option value="2026">2026</option>
            <option value="2023">2023</option>
            <option value="2022">2022</option>
        </select>
        
        <select name="status">
            <option value="">Semua Status</option>
            <option value="aktif">Aktif</option>
            <option value="lulus">Lulus</option>
            <option value="cuti">Cuti</option>
        </select>
        
        <input type="submit" value="Filter">
    </form>
    
    <?php
    $conn = new mysqli("localhost", "root", "", "universitas");
    
    // Membangun query dinamis
    $sql = "SELECT * FROM mahasiswa WHERE 1=1";
    $params = [];
    $types = "";
    
    if (!empty($_GET['angkatan'])) {
        $sql .= " AND angkatan = ?";
        $params[] = $_GET['angkatan'];
        $types .= "i";
    }
    
    if (!empty($_GET['status'])) {
        $sql .= " AND status = ?";
        $params[] = $_GET['status'];
        $types .= "s";
    }
    
    $sql .= " ORDER BY nama";
    
    // Prepared statement
    $stmt = $conn->prepare($sql);
    if (!empty($params)) {
        $stmt->bind_param($types, ...$params);
    }
    $stmt->execute();
    $result = $stmt->get_result();
    
    // Tampilkan hasil
    echo "<table border='1'>";
    echo "<tr><th>NIM</th><th>Nama</th><th>Angkatan</th><th>Status</th></tr>";
    
    while ($row = $result->fetch_assoc()) {
        echo "<tr>";
        echo "<td>" . $row['nim'] . "</td>";
        echo "<td>" . $row['nama'] . "</td>";
        echo "<td>" . $row['angkatan'] . "</td>";
        echo "<td>" . $row['status'] . "</td>";
        echo "</tr>";
    }
    echo "</table>";
    
    $stmt->close();
    $conn->close();
    ?>
</body>
</html>
27

11 MYSQL ORDER BY

A. ORDER BY

ORDER BY digunakan untuk mengurutkan hasil query.

Sintaks

SELECT kolom1, kolom2
FROM tabel
ORDER BY kolom1 [ASC|DESC], kolom2 [ASC|DESC];

Contoh

-- Urutkan berdasarkan nama (A-Z)
SELECT * FROM mahasiswa ORDER BY nama ASC;

-- Urutkan berdasarkan angkatan terbaru
SELECT * FROM mahasiswa ORDER BY angkatan DESC;

-- Multiple sorting
SELECT * FROM mahasiswa 
ORDER BY angkatan DESC, nama ASC;

-- Sorting dengan ekspresi
SELECT nama, YEAR(tanggal_lahir) AS tahun_lahir
FROM mahasiswa
ORDER BY tahun_lahir DESC;

โšก Praktikum 11: Pengurutan Data

Praktikum 11.1: Tabel dengan Sorting Dinamis

<!DOCTYPE html>
<html>
<head>
    <title>Data Mahasiswa dengan Sorting</title>
    <style>
        th a { color: white; text-decoration: none; }
        th a:hover { text-decoration: underline; }
        .sorted { background: #2980b9; }
    </style>
</head>
<body>
    <h2>๐Ÿ“Š Data Mahasiswa</h2>
    
    <?php
    $conn = new mysqli("localhost", "root", "", "universitas");
    
    // Ambil parameter sorting
    $order_by = isset($_GET['sort']) ? $_GET['sort'] : 'nama';
    $order_dir = isset($_GET['dir']) ? $_GET['dir'] : 'ASC';
    
    // Toggle direction untuk next click
    $next_dir = ($order_dir == 'ASC') ? 'DESC' : 'ASC';
    
    // Query dengan sorting
    $sql = "SELECT * FROM mahasiswa ORDER BY $order_by $order_dir";
    $result = $conn->query($sql);
    ?>
    
    <table border="1">
        <tr>
            <th><a href="?sort=nim&dir=<?php echo $next_dir; ?>">NIM</a></th>
            <th><a href="?sort=nama&dir=<?php echo $next_dir; ?>">Nama</a></th>
            <th><a href="?sort=angkatan&dir=<?php echo $next_dir; ?>">Angkatan</a></th>
            <th><a href="?sort=ipk&dir=<?php echo $next_dir; ?>">IPK</a></th>
        </tr>
        
        <?php
        while ($row = $result->fetch_assoc()) {
            echo "<tr>";
            echo "<td>" . $row['nim'] . "</td>";
            echo "<td>" . $row['nama'] . "</td>";
            echo "<td>" . $row['angkatan'] . "</td>";
            echo "<td>" . number_format($row['ipk'] ?? 0, 2) . "</td>";
            echo "</tr>";
        }
        ?>
    </table>
    
    <p>Diurutkan berdasarkan: <?php echo "$order_by $order_dir"; ?></p>
</body>
</html>
30

12 MYSQL DELETE DATA

A. DELETE Statement

DELETE digunakan untuk menghapus data dari tabel.

Sintaks Dasar

DELETE FROM nama_tabel
[WHERE kondisi];

โš ๏ธ Peringatan Penting

Jangan lupa WHERE clause! Jika tidak menggunakan WHERE, SEMUA data dalam tabel akan terhapus!

โšก Praktikum 12: Hapus Data dengan Konfirmasi

Praktikum 12.1: Hapus Data dengan Konfirmasi

<!DOCTYPE html>
<html>
<head>
    <title>Hapus Data Mahasiswa</title>
    <script>
        function confirmDelete(id, nama) {
            if (confirm("Apakah Anda yakin ingin menghapus mahasiswa " + nama + "?")) {
                window.location.href = "?hapus=" + id;
            }
        }
    </script>
</head>
<body>
    <h2>๐Ÿ—‘๏ธ Hapus Data Mahasiswa</h2>
    
    <?php
    $conn = new mysqli("localhost", "root", "", "universitas");
    
    // Proses hapus data
    if (isset($_GET['hapus'])) {
        $id = (int)$_GET['hapus'];
        
        // Mulai transaction
        $conn->begin_transaction();
        
        try {
            // Hapus data terkait di perkuliahan
            $conn->query("DELETE FROM perkuliahan WHERE id_mahasiswa = $id");
            
            // Hapus data mahasiswa
            $conn->query("DELETE FROM mahasiswa WHERE id = $id");
            
            // Commit transaction
            $conn->commit();
            echo "<p style='color: green'>โœ… Data berhasil dihapus!</p>";
            
        } catch (Exception $e) {
            // Rollback jika error
            $conn->rollback();
            echo "<p style='color: red'>โŒ Gagal menghapus: " . $e->getMessage() . "</p>";
        }
    }
    
    // Tampilkan data mahasiswa
    $result = $conn->query("SELECT * FROM mahasiswa ORDER BY nama");
    ?>
    
    <table border="1">
        <tr>
            <th>NIM</th>
            <th>Nama</th>
            <th>Angkatan</th>
            <th>Status</th>
            <th>Aksi</th>
        </tr>
        
        <?php
        while ($row = $result->fetch_assoc()) {
            echo "<tr>";
            echo "<td>" . $row['nim'] . "</td>";
            echo "<td>" . $row['nama'] . "</td>";
            echo "<td>" . $row['angkatan'] . "</td>";
            echo "<td>" . $row['status'] . "</td>";
            echo "<td>";
            echo "<button onclick='confirmDelete(" . $row['id'] . ", \"" . $row['nama'] . "\")'>Hapus</button>";
            echo "</td>";
            echo "</tr>";
        }
        ?>
    </table>
</body>
</html>
๐Ÿ’ก Tips Menghapus Data:
  • Selalu gunakan WHERE clause untuk menghindari penghapusan massal
  • Gunakan transaction jika menghapus data dari multiple tabel
  • Backup data sebelum melakukan delete di production
  • Pertimbangkan soft delete (menambahkan kolom deleted_at) daripada hard delete
33

13 MYSQL UPDATE DATA

A. UPDATE Statement

UPDATE digunakan untuk mengubah data yang sudah ada.

Sintaks Dasar

UPDATE nama_tabel
SET kolom1 = nilai1, kolom2 = nilai2, ...
[WHERE kondisi];

โšก Praktikum 13: Update Data

Praktikum 13.1: Form Edit Data

<!DOCTYPE html>
<html>
<head>
    <title>Edit Data Mahasiswa</title>
</head>
<body>
    <h2>โœ๏ธ Edit Data Mahasiswa</h2>
    
    <?php
    $conn = new mysqli("localhost", "root", "", "universitas");
    
    // Proses update data
    if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['update'])) {
        $id = (int)$_POST['id'];
        $nama = $conn->real_escape_string($_POST['nama']);
        $email = $conn->real_escape_string($_POST['email']);
        $status = $conn->real_escape_string($_POST['status']);
        
        $sql = "UPDATE mahasiswa SET 
                nama = '$nama',
                email = '$email',
                status = '$status',
                updated_at = CURRENT_TIMESTAMP
                WHERE id = $id";
        
        if ($conn->query($sql) === TRUE) {
            echo "<p style='color: green'>โœ… Data berhasil diupdate!</p>";
        } else {
            echo "<p style='color: red'>โŒ Error: " . $conn->error . "</p>";
        }
    }
    
    // Ambil data untuk diedit
    if (isset($_GET['id'])) {
        $id = (int)$_GET['id'];
        $result = $conn->query("SELECT * FROM mahasiswa WHERE id = $id");
        $data = $result->fetch_assoc();
    }
    ?>
    
    <form method="POST" action="">
        <input type="hidden" name="id" value="<?php echo $data['id']; ?>">
        
        <label>NIM:</label>
        <input type="text" value="<?php echo $data['nim']; ?>" disabled><br>
        
        <label>Nama:</label>
        <input type="text" name="nama" value="<?php echo htmlspecialchars($data['nama']); ?>" required><br>
        
        <label>Email:</label>
        <input type="email" name="email" value="<?php echo htmlspecialchars($data['email']); ?>" required><br>
        
        <label>Status:</label>
        <select name="status">
            <option value="aktif" <?php echo $data['status'] == 'aktif' ? 'selected' : ''; ?>>Aktif</option>
            <option value="cuti" <?php echo $data['status'] == 'cuti' ? 'selected' : ''; ?>>Cuti</option>
            <option value="lulus" <?php echo $data['status'] == 'lulus' ? 'selected' : ''; ?>>Lulus</option>
            <option value="keluar" <?php echo $data['status'] == 'keluar' ? 'selected' : ''; ?>>Keluar</option>
        </select><br>
        
        <input type="submit" name="update" value="Update Data">
        <a href="daftar_mahasiswa.php">Batal</a>
    </form>
</body>
</html>
36

14 MYSQL LIMIT DATA

A. LIMIT Clause

LIMIT digunakan untuk membatasi jumlah baris yang ditampilkan.

Sintaks

SELECT kolom FROM tabel LIMIT jumlah;
SELECT kolom FROM tabel LIMIT offset, jumlah;

โšก Praktikum 14: Pagination dengan LIMIT

Praktikum 14.1: Pagination Sederhana

<!DOCTYPE html>
<html>
<head>
    <title>Data Mahasiswa dengan Pagination</title>
</head>
<body>
    <h2>๐Ÿ“„ Data Mahasiswa (Pagination)</h2>
    
    <?php
    $conn = new mysqli("localhost", "root", "", "universitas");
    
    // Konfigurasi pagination
    $limit = 5; // Jumlah data per halaman
    $page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
    $offset = ($page - 1) * $limit;
    
    // Hitung total data
    $total_result = $conn->query("SELECT COUNT(*) as total FROM mahasiswa");
    $total_row = $total_result->fetch_assoc();
    $total_data = $total_row['total'];
    $total_pages = ceil($total_data / $limit);
    
    // Ambil data dengan LIMIT
    $sql = "SELECT * FROM mahasiswa ORDER BY nama LIMIT $offset, $limit";
    $result = $conn->query($sql);
    ?>
    
    <table border="1">
        <tr>
            <th>No</th>
            <th>NIM</th>
            <th>Nama</th>
            <th>Angkatan</th>
            <th>Status</th>
        </tr>
        
        <?php
        $no = $offset + 1;
        while ($row = $result->fetch_assoc()) {
            echo "<tr>";
            echo "<td>$no</td>";
            echo "<td>" . $row['nim'] . "</td>";
            echo "<td>" . $row['nama'] . "</td>";
            echo "<td>" . $row['angkatan'] . "</td>";
            echo "<td>" . $row['status'] . "</td>";
            echo "</tr>";
            $no++;
        }
        ?>
    </table>
    
    <div class="pagination">
        <?php if ($page > 1): ?>
            <a href="?page=<?php echo $page-1; ?>">ยซ Previous</a>
        <?php endif; ?>
        
        <?php for ($i = 1; $i <= $total_pages; $i++): ?>
            <a href="?page=<?php echo $i; ?>" 
               style="<?php echo $i == $page ? 'font-weight: bold;' : ''; ?>">
                <?php echo $i; ?>
            </a>
        <?php endfor; ?>
        
        <?php if ($page < $total_pages): ?>
            <a href="?page=<?php echo $page+1; ?>">Next ยป</a>
        <?php endif; ?>
    </div>
    
    <p>Menampilkan halaman <?php echo $page; ?> dari <?php echo $total_pages; ?></p>
</body>
</html>
39

A STUDI KASUS: APLIKASI PERPUSTAKAAN

Membangun Aplikasi Perpustakaan Lengkap

Sebagai final project, kita akan membangun aplikasi manajemen perpustakaan yang mengintegrasikan semua konsep MySQL.

Struktur Database Perpustakaan

buku

๐Ÿ”‘ id (PK)
judul
pengarang
penerbit
tahun_terbit
isbn
stok

anggota

๐Ÿ”‘ id (PK)
no_anggota
nama
alamat
no_telepon
email
tanggal_daftar

peminjaman

๐Ÿ”‘ id (PK)
๐Ÿ”— id_buku (FK)
๐Ÿ”— id_anggota (FK)
tanggal_pinjam
tanggal_kembali
tanggal_kembali_aktual
status
denda
-- SQL Script untuk Database Perpustakaan

CREATE DATABASE IF NOT EXISTS perpustakaan
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

USE perpustakaan;

-- Tabel Buku
CREATE TABLE buku (
    id INT AUTO_INCREMENT PRIMARY KEY,
    judul VARCHAR(200) NOT NULL,
    pengarang VARCHAR(100) NOT NULL,
    penerbit VARCHAR(100),
    tahun_terbit YEAR,
    isbn VARCHAR(20) UNIQUE,
    stok INT DEFAULT 1,
    rak VARCHAR(10),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

-- Tabel Anggota
CREATE TABLE anggota (
    id INT AUTO_INCREMENT PRIMARY KEY,
    no_anggota VARCHAR(20) NOT NULL UNIQUE,
    nama VARCHAR(100) NOT NULL,
    jenis_kelamin ENUM('L', 'P'),
    alamat TEXT,
    no_telepon VARCHAR(15),
    email VARCHAR(100),
    tanggal_daftar DATE DEFAULT CURRENT_DATE,
    status ENUM('aktif', 'nonaktif') DEFAULT 'aktif',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Tabel Peminjaman
CREATE TABLE peminjaman (
    id INT AUTO_INCREMENT PRIMARY KEY,
    id_buku INT NOT NULL,
    id_anggota INT NOT NULL,
    tanggal_pinjam DATE NOT NULL,
    tanggal_kembali DATE NOT NULL,
    tanggal_kembali_aktual DATE,
    status ENUM('dipinjam', 'kembali', 'terlambat') DEFAULT 'dipinjam',
    denda DECIMAL(10,2) DEFAULT 0,
    keterangan TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (id_buku) REFERENCES buku(id) ON DELETE RESTRICT,
    FOREIGN KEY (id_anggota) REFERENCES anggota(id) ON DELETE RESTRICT
);

-- Insert data sample
INSERT INTO buku (judul, pengarang, penerbit, tahun_terbit, isbn, stok, rak) VALUES
    ('Pemrograman Web dengan PHP', 'Budi Santoso', 'Informatika', 2023, '978-602-1234-01-1', 5, 'A01'),
    ('Belajar MySQL', 'Ani Wijaya', 'Andi Offset', 2022, '978-602-1234-02-8', 3, 'A02'),
    ('Database System', 'John Doe', 'Pearson', 2021, '978-602-1234-03-5', 2, 'B01'),
    ('Algoritma Pemrograman', 'Citra Dewi', 'Gramedia', 2023, '978-602-1234-04-2', 4, 'B02'),
    ('Jaringan Komputer', 'Eko Prasetyo', 'Elex Media', 2022, '978-602-1234-05-9', 3, 'C01');

INSERT INTO anggota (no_anggota, nama, jenis_kelamin, alamat, no_telepon, email) VALUES
    ('AG001', 'Ahmad Fauzi', 'L', 'Jl. Merdeka No.1', '08123456781', 'ahmad@email.com'),
    ('AG002', 'Budi Santoso', 'L', 'Jl. Sudirman No.5', '08123456782', 'budi@email.com'),
    ('AG003', 'Citra Dewi', 'P', 'Jl. Gatot Subroto No.10', '08123456783', 'citra@email.com'),
    ('AG004', 'Dian Purnama', 'P', 'Jl. Diponegoro No.15', '08123456784', 'dian@email.com'),
    ('AG005', 'Eko Putra', 'L', 'Jl. Ahmad Yani No.20', '08123456785', 'eko@email.com');

INSERT INTO peminjaman (id_buku, id_anggota, tanggal_pinjam, tanggal_kembali, status) VALUES
    (1, 1, '2026-01-15', '2026-01-22', 'dipinjam'),
    (2, 2, '2026-01-16', '2026-01-23', 'dipinjam'),
    (3, 3, '2026-01-10', '2026-01-17', 'kembali'),
    (1, 4, '2026-01-12', '2026-01-19', 'kembali'),
    (4, 5, '2026-01-14', '2026-01-21', 'terlambat');

๐Ÿ“š Latihan Akhir: Aplikasi Perpustakaan

Soal 1: Buat halaman untuk menampilkan daftar buku dengan fitur:

  • Pencarian berdasarkan judul atau pengarang
  • Pagination (10 data per halaman)
  • Sorting berdasarkan judul, pengarang, tahun
  • Tampilkan status stok (tersedia/habis)

Soal 2: Buat form peminjaman buku dengan fitur:

  • Dropdown anggota (hanya yang aktif)
  • Dropdown buku (hanya yang stok > 0)
  • Tanggal pinjam otomatis hari ini
  • Tanggal kembali otomatis +7 hari
  • Validasi stok sebelum menyimpan

Soal 3: Buat halaman pengembalian buku dengan fitur:

  • Cari peminjaman berdasarkan nama anggota atau judul buku
  • Tampilkan informasi peminjaman
  • Hitung denda jika terlambat (Rp 1000/hari)
  • Update stok buku setelah pengembalian

Soal 4: Buat laporan statistik perpustakaan:

  • Jumlah buku, anggota, peminjaman
  • 10 buku paling sering dipinjam
  • Anggota paling aktif
  • Total denda terkumpul
  • Grafik peminjaman per bulan

Soal 5: Implementasikan fitur keamanan:

  • Gunakan prepared statement untuk semua query
  • Validasi input di sisi server
  • Transaction untuk proses peminjaman/pengembalian
  • Prevent SQL injection

B GLOSARIUM

ACID
Atomicity, Consistency, Isolation, Durability - properti yang menjamin keandalan transaksi database.
AUTO_INCREMENT
Fitur MySQL yang secara otomatis menghasilkan nomor unik untuk kolom primary key.
Constraint
Aturan yang diterapkan pada kolom untuk menjaga integritas data (PRIMARY KEY, FOREIGN KEY, UNIQUE, NOT NULL).
CRUD
Create, Read, Update, Delete - empat operasi dasar pada database.
Database
Kumpulan data terorganisir yang disimpan secara elektronik dalam sistem komputer.
ERD
Entity Relationship Diagram - diagram yang menunjukkan hubungan antar tabel dalam database.
Foreign Key
Kolom yang menghubungkan dua tabel dengan mereferensi ke primary key tabel lain.
Index
Struktur data yang mempercepat proses pencarian data dalam tabel.
JOIN
Operasi untuk menggabungkan data dari dua atau lebih tabel berdasarkan kolom yang berhubungan.
Normalisasi
Proses mengorganisir data untuk mengurangi redundansi dan meningkatkan integritas.
Pagination
Teknik membagi data menjadi beberapa halaman untuk memudahkan navigasi.
Prepared Statement
Fitur keamanan untuk mencegah SQL injection dengan memisahkan query dan data.
Primary Key
Kolom yang secara unik mengidentifikasi setiap baris dalam tabel.
Query
Permintaan untuk mengambil atau memanipulasi data dalam database.
RDBMS
Relational Database Management System - software untuk mengelola database relasional.
SQL
Structured Query Language - bahasa standar untuk mengelola database relasional.
Transaction
Unit kerja yang terdiri dari satu atau lebih operasi database yang dieksekusi secara atomik.
View
Tabel virtual yang didasarkan pada hasil query SELECT.

C DAFTAR PUSTAKA

Buku Referensi

  1. MySQL Documentation Team. (2023). MySQL 8.0 Reference Manual. Oracle Corporation.
  2. Silberschatz, A., Korth, H. F., & Sudarshan, S. (2020). Database System Concepts (7th ed.). McGraw-Hill.
  3. Welling, L., & Thomson, L. (2017). PHP and MySQL Web Development (5th ed.). Addison-Wesley.
  4. Nixon, R. (2021). Learning PHP, MySQL & JavaScript (6th ed.). O'Reilly Media.
  5. Connolly, T., & Begg, C. (2015). Database Systems: A Practical Approach to Design, Implementation, and Management (6th ed.). Pearson.

Sumber Online

  • MySQL Official Documentation - https://dev.mysql.com/doc/
  • W3Schools SQL Tutorial - https://www.w3schools.com/sql/
  • MySQL Tutorial - https://www.mysqltutorial.org/
  • PHP Manual: MySQLi - https://www.php.net/manual/en/book.mysqli.php
  • PHP Manual: PDO - https://www.php.net/manual/en/book.pdo.php

Tools dan Software

  • MySQL Community Server - https://dev.mysql.com/downloads/
  • phpMyAdmin - https://www.phpmyadmin.net/
  • MySQL Workbench - https://www.mysql.com/products/workbench/
  • HeidiSQL - https://www.heidisql.com/
  • DBeaver - https://dbeaver.io/

D INDEX

A
  • ACID 42
  • Alias 24
  • ALTER TABLE 10
  • AND operator 27
  • AUTO_INCREMENT 10, 16
B
  • BETWEEN 27
  • BIGINT 1
  • BLOB 1
C
  • CHAR 1
  • CHARACTER SET 7
  • CHECK constraint 10
  • COLLATE 7
  • Column 10
  • COMMIT 33
  • CONCAT 24
  • Constraint 10
  • COUNT 39
  • CREATE DATABASE 7
  • CREATE TABLE 10
  • CRUD 13, 24, 33, 36
D
  • Data types 1
  • Database 1, 7
  • DATE 1
  • DATETIME 1
  • DECIMAL 1
  • DEFAULT 10
  • DELETE 33
  • DESC 10, 30
  • DROP DATABASE 7
  • DROP TABLE 10
E
  • ENUM 1
  • ERD 10, 42
  • EXPLAIN 24
F
  • FLOAT 1
  • Foreign Key 10, 42
  • FROM 24
G
  • GROUP BY 24
H
  • HAVING 24
I
  • IN 27
  • Index 10
  • INNER JOIN 24
  • INSERT 13, 16, 18
  • INT 1
  • IS NULL 27
J
  • JOIN 24
L
  • LAST_INSERT_ID 16
  • LEFT JOIN 24
  • LIKE 27
  • LIMIT 39
M
  • MAX 24
  • MIN 24
  • MySQL 1
  • MySQLi 4
N
  • Normalization 42
  • NOT NULL 10
  • NULL 10, 27
O
  • OFFSET 39
  • OR operator 27
  • ORDER BY 30
P
  • Pagination 39
  • PDO 4, 21
  • phpMyAdmin 1, 4
  • Prepared statement 21
  • Primary Key 10, 16
R
  • RDBMS 1
  • ROLLBACK 33
S
  • SELECT 24
  • SET 1, 36
  • SHOW 7, 10
  • SQL injection 21
  • SUM 24
T
  • Table 10
  • TEXT 1
  • TIME 1
  • TIMESTAMP 1
  • TINYINT 1
  • Transaction 33, 42
U
  • UNION 24
  • UNIQUE 10
  • UPDATE 36
  • USE 7
V
  • VARCHAR 1
  • View 42
W
  • WHERE 27
X
  • XAMPP 4
Y
  • YEAR 1